package handlers

import (
	"time"

	"github.com/labstack/echo/v4"
	"gorm.io/gorm"

	// "fmt"

	"night-school-api/database"
	"night-school-api/models"
	"night-school-api/utils"
)

func Enroll(c echo.Context) error {
	uid := c.Get("uid").(int)

	var req models.Enrollment

	// 解析 JSON 请求
	if err := c.Bind(&req); err != nil {
		return utils.JSONError(c, "参数错误: " + err.Error())
	}

	if err := c.Validate(&req); err != nil {
		return err
	}

	req.UserID = uid

	db := database.DB

	var course models.Course
	db.First(&course, req.CourseID)
	if course.ID <= 0 {
		return utils.JSONError(c, "课程不存在")
	}
	if course.UserID == uid {
		return utils.JSONError(c, "您不能报名自己是老师的课程")
	}
	if course.Status != models.AuditApproved {
		return utils.JSONError(c, "不能报名未审核通过的课程")
	}


	now := time.Now().In(models.TimeLocation)
	if course.EnrollEndAt.Before(now) {
		return utils.JSONError(c, "课程报名截止时间已过，不能再报名")
	}

	if course.EnrollAmount >= course.CapacityMax {
		return utils.JSONError(c, "课程报名人数已满，不能再报名")
	}

	var count int64
	db.Model(&models.Enrollment{}).Where("course_id =? AND user_id =?", req.CourseID, uid).Count(&count)
	if count > 0 {
		return utils.JSONError(c, "您已经报名了该课程，请勿重复报名")
	}

	err := db.Transaction(func(tx *gorm.DB) error {
		// 新增课程报名记录
		if err := tx.Create(&req).Error; err != nil {
			return err // 事务回滚
		}

		// 更新课程报名人数
		if err := tx.Model(&models.Course{}).Where("id =?", course.ID).Update("enroll_amount", course.EnrollAmount + 1).Error; err != nil {
			return err // 事务回滚
		}

		return nil // 事务提交
	})

	if err != nil {
		c.Logger().Info("报名课程失败: " + err.Error())
		return utils.JSONError(c, "报名课程失败")
	} else {
		return utils.JSONSuccess(c, nil, "报名课程成功，请等待管理员审核")
	}
}

func CancelEnroll(c echo.Context) error {
	uid := c.Get("uid").(int)

	var req map[string]interface{}
	if err := c.Bind(&req); err != nil {
		return utils.JSONError(c, "请求参数错误")
	}

	var id int
	idFloat, ok := req["id"].(float64)
	if !ok {
		return utils.JSONError(c, "请求参数错误")
	} else {
		id = int(idFloat)
	}

	if id <= 0 {
		return utils.JSONError(c, "请求参数不合法")
	}


	db := database.DB
	
	var enrollment models.Enrollment
	db.First(&enrollment, id)

	if enrollment.ID <= 0 {
		return utils.JSONError(c, "取消报名失败，请刷新重试")
	}
	
	if enrollment.UserID != uid {
		return utils.JSONError(c, "您不能取消报名其他人的课程报名")
	}
	
	
	var course models.Course
	db.First(&course, enrollment.CourseID)

	if course.ID <= 0 {
		return utils.JSONError(c, "课程不存在")
	}

	err := db.Transaction(func(tx *gorm.DB) error {
		// 删除课程报名记录
		if err := tx.Delete(&enrollment).Error; err != nil {
			return err // 事务回滚
		}

		// 更新课程报名人数
		if err := tx.Model(&models.Course{}).Where("id =?", course.ID).Update("enroll_amount", course.EnrollAmount - 1).Error; err != nil {
			return err // 事务回滚
		}

		return nil // 事务提交
	})

	if err != nil {
		c.Logger().Info("取消课程报名失败: " + err.Error())
		return utils.JSONError(c, "取消课程报名失败")
	} else {
		return utils.JSONSuccess(c, nil, "取消课程报名成功")
	}
}
